Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2018, 03:02
Интересующийся
Отправить личное сообщение для galiog Посмотреть профиль Найти все сообщения от galiog
 
Регистрация: 28.04.2016
Сообщений: 17

Вытащить переменную из XMLHttpRequest
Здравствуйте. Прошу помощи в таком моменте. Есть метод:
getJsons(){
      let name= '' ;
      let request = new XMLHttpRequest();
      request.open('GET', '../name.json');
      request.onreadystatechange = function(e) {
          if (this.readyState == 4) {
              if (this.status == 200) {
                  var response = JSON.parse(this.responseText);
                return  name = response["price"][1]["descr"];
              }
              else {
                  // тут сообщаем о сетевой ошибке
              }
          }
      }
      request.send(null);
     
     }


Мне нужно вытащить переменную name, в которой данные из json. Если просто написать при статусе 200 alert или console.log, то все отрабатывает. А из вне не могу до нее никак добраться. Написал уже return, но не помогает.
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2018, 04:07
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Либо сделать глобальной, либо передать аргументом там где она нужна.
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2018, 04:32
Интересующийся
Отправить личное сообщение для galiog Посмотреть профиль Найти все сообщения от galiog
 
Регистрация: 28.04.2016
Сообщений: 17

name ='описание';
        getJsons(){
       // this.name = 'Нажали';
     var request = new XMLHttpRequest();
      request.open('GET', '../ssl.json');
      request.onreadystatechange = function(e) {
          if (this.readyState == 4) {
              if (this.status == 200) {
                  var response = JSON.parse(this.responseText);
                  this.name = response["pricelist"][1]["name"];
                 }
              else {
                  // тут сообщаем о сетевой ошибке
              }
          }
      }
      request.send(null);
     }

Спасибо за ответ. Вынес переменную в глобальную область видимости. Попробовал выполнить простую команду this.name = 'Нажали'; по клику, она сработала, переменная передалась. Сейчас строку закомментировал эту. А this.name = response["pricelist"][1]["name"]; по прежнему не передается, сейчас вылазит ошибка name is not defined. Но почему? Она же определена...
Ответить с цитированием
  #4 (permalink)  
Старый 01.02.2018, 08:11
Интересующийся
Отправить личное сообщение для galiog Посмотреть профиль Найти все сообщения от galiog
 
Регистрация: 28.04.2016
Сообщений: 17

Добавлю немного информации)
Вообще все делаю на втором ангуляре. По сути мне надо в переменную в шаблоне компонента биндить новое значение по клику.
<button (click)="getJsons()">Клик</button>
  <p>{{name}}</p>


По клику собственно я вызываю мою функцию. Причем с таким кодом:
export class WindowComponent{
    name:string = '';
    getJsons(){
            var request = new XMLHttpRequest();
            request.open('GET', '../ssl.json');
            request.onreadystatechange = function(e) {
                if (this.readyState == 4) {
                    if (this.status == 200) {
                        var response = JSON.parse(this.responseText);
                        this.name = response["pricelist"][1]["name"];
                    }
                    else {
                        // тут сообщаем о сетевой ошибке
                    }
                }
            }
            request.send(null);
    }

}


Ошибок нет и во вкладке network видно что запросы улетаю. Просто данные не попадают в переменную.
Ответить с цитированием
  #5 (permalink)  
Старый 01.02.2018, 10:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,831

galiog, "this" в строке 10 - не экземпляр класса "WindowComponent", но экземпляр "XMLHttpRequest".
В методе создайте ссылку на контекст и в "onreadystatechange" через эту ссылку измените нужное свойство.
Ответить с цитированием
  #6 (permalink)  
Старый 01.02.2018, 13:37
Интересующийся
Отправить личное сообщение для galiog Посмотреть профиль Найти все сообщения от galiog
 
Регистрация: 28.04.2016
Сообщений: 17

Спасибо! Сделал вот так и все заработало:
name = '';
    getJsons(){
            let self = this;
            let request = new XMLHttpRequest();
            request.open('GET', '../ssl.json');
            request.onreadystatechange = function(e) {
                if (this.readyState == 4) {
                    if (this.status == 200) {
                        var response = JSON.parse(this.responseText);
                        self.name = response["pricelist"][1]["description"];
                    }
                    else {
                        // тут сообщаем о сетевой ошибке
                    }
                }
            }
            request.send(null);
    }

Ох уж этот контекст. Учить еще да учить.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вытащить значение в переменную между тегов с множественным переносом строки petral7 Javascript под браузер 20 11.08.2016 06:06
Не удается вытащить переменную Gerd199 Общие вопросы Javascript 2 04.02.2016 08:50
Как вытащить из Return в переменную для передачи в форму? Enterely Javascript под браузер 9 11.02.2015 17:10
как вытащить переменную из следующего скрипта k0rshun Ваши сайты и скрипты 2 21.05.2014 10:11
как вытащить переменную из следующего скрипта k0rshun Общие вопросы Javascript 15 24.04.2014 11:17